#include <mod/include/LCD.h>

void LCD_Write(unsigned char ch, unsigned short int position){
   unsigned short int loop;
   if(position>15){                                             //check of positie groter is als 15
      position+=24;                                             //zo ja tel er 24 bij op om te zorgen dat het op het scherm op de volgende regel verschijnt
   }
   if((ch>64)&&(ch<91)){                                        //check of het tussen A-Z valt
      ch+=128;                                                  //zo ja tel er 128 bij op
   }else if((ch>47)&&(ch<58)){                                  //check of het karakter tussen 0-9 valt
      ch+=128;                                                  //zo ja tel er 128 bij op
   }else if(ch==' '){                                           //check of er een spatie wordt geschreven
      ch=0xA0;                                                  //Maak het karakter kloppend met de interne tabel van lcd
   }else if(ch=='!'){                                           //check of er een uitroepteken wordt geschreven
      ch=0xA1;                                                  //Maak het karakter kloppend met de interne tabel van lcd
   }else if(ch=='.'){                                           //check of er een punt wordt geschreven
      ch=0x40;                                                  //Maak het karakter kloppend met de interne tabel van lcd
   }else if(ch=='#'){                                           //check of er een punt wordt geschreven
      ch=0xA3;                                                  //Maak het karakter kloppend met de interne tabel van lcd
   }else if(ch=='*'){                                           //check of er een punt wordt geschreven
      ch=0xAA;                                                  //Maak het karakter kloppend met de interne tabel van lcd
   }else if(ch=='?'){                                           //check of er een punt wordt geschreven
      ch=0xBF;                                                  //Maak het karakter kloppend met de interne tabel van lcd
   }else if(ch==','){                                           //check of er een punt wordt geschreven
      ch=0xAC;                                                  //Maak het karakter kloppend met de interne tabel van lcd
   }
   TWI_Start(0x3B,0);                                           //Start communicatie
   TWI_Write(0x80);                                             //Stuur configuratie commando
   TWI_Write((position&0x7F)|0x80);                             //Zet positie
   TWI_Start(0x3B,0);                                           //Herstart
   TWI_Write(0x40);                                             //Stuur lcd commando
   TWI_Write(ch);                                               //Stuur karakter
   TWI_Stop();                                                  //Beeindig communicatie
   loop=200;                                                    //Zet loop waarde
   while(loop--);                                               //Doorloop wacht loop
}

void LCD_Writeln(unsigned char *ch){
   unsigned short int loop=0,adress=0;
   while((loop<32)&&(adress<32)){                               //Check of de loop en adress kleiner dan 32 zijn
      if((*(ch+loop))=='\n'){                                   //Check of er een newline kaakter is meegegeven
         if(adress<16){                                         //Check of de positie kleiner is dan 16 
            adress=15;                                          //Zo ja adress is 15
         }else{
            loop=32;                                            //Zo nee zet loop op 32
         }
      }else{
         LCD_Write((*(ch+loop)),adress);                        //Zo nee schrif karakter naar LCD_Write
      }
      adress++;                                                 //Verhoog adress
      loop++;                                                   //Verhoog loop
   }
   loop=200;                                                    //Zet loop waarde
   while(loop--);                                               //Doorloop wacht loop
}

void LCD_Init(void){
   unsigned short int loop;
   TWI_Start(0x3B,0);
   TWI_Write(0x00);
   TWI_Write(0x35);
   TWI_Write(0x9F);
   TWI_Write(0x34);
   TWI_Write(0x0C);
   TWI_Write(0x06);
   TWI_Write(0x02);
   TWI_Stop();
   loop=200;
   while(loop--);
   TWI_Start(0x3B,0);
   TWI_Write(0x40);
   loop=80;
   while(loop--){
      TWI_Write(0xA0);
   }
   loop=200;
   while(loop--);
}

void LCD_Clear(void){
   unsigned int loop;
   for(loop=0;loop<32;loop++){
      LCD_Write(' ',loop);
   }
}
